/**
 * 多继承
 * 
 * 知识点
 *      1、js中继承是依赖于原型prototype链实现的，只有一条原型链，理论上不能继承多个父类
 *      2、如何在js中多继承
 *      3、当前很流行的用来继承单对象属性的extend方法
 */
/**
 * extend，复制对象中的属性
 * 
 * 浅复制，只能复制值类型的属性，对于引用类型的无能为力
 */
var extend = function(target, source) {
    for(var property in source) {
        target[property] = source[property];
    }
    return target;
};

var book = {
    name: 'js设计模式',
    alike: ['css', 'html', 'JavaScript']
};

var anotherBook = {
    color: 'blue'
};

extend(anotherBook, book);
console.log(anotherBook.name);//js设计模式
console.log(anotherBook.alike);//['css', 'html', 'JavaScript']

anotherBook.alike.push('ajax');
anotherBook.name = '设计模式';
console.log(anotherBook.name);//设计模式
console.log(anotherBook.alike);//['css', 'html', 'JavaScript', '设计模式']
console.log(book.name);//js设计模式
console.log(book.alike);//['css', 'html', 'JavaScript', '设计模式']

/**
 * 对传递进来的多个对象进行对象属性的复制继承
 * 
 * 但是使用的时候需要传入目标对象「第一个参数」
 */
var mix = function() {
    var i = 1,                  //从第二个参数起为被继承的对象
        len = arguments.length, //获取参数长度
        target = arguments[0],  //第一个对象为目标对象
        arg;                    //缓存参数对象
    for(; i < len; i++) {
        arg = arguments[i];
        for (var property in arg) {
            target[property] = arg[property];
        }
    }
    return target;
};

/**
 * 将mix方法绑定到原生对象Object上
 */
Object.prototype.mix = function() {
    var i = 0,                  //从第二个参数起为被继承的对象
        len = arguments.length, //获取参数长度
        arg;                    //缓存参数对象
    for(; i < len; i++) {
        arg = arguments[i];
        for (var property in arg) {
            this[property] = arg[property];
        }
    }
    return target;
};
